#include "stm32f10x.h"


void trans_m2m_dma(uint32_t source_addr,uint32_t dest_addr,uint16_t data_unit_count){

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    
    DMA_InitTypeDef dma_def;

    // 配置此次需要转运多少个数据单位
    // 即 DMA 转运计数器的值
    dma_def.DMA_BufferSize=data_unit_count;
    
    // 外围电路是否是此次DMA的起点或终点
    // 此次DMA的转运方向
    dma_def.DMA_DIR=DMA_DIR_PeripheralSRC;
    
    // 启用循环模式DMA转运
    // 内存到内存模式下的DMA不能使用 循环模式
    dma_def.DMA_Mode=DMA_Mode_Circular; // m2m模式下此配置无效
    
    // 关闭 m2m 模式
    dma_def.DMA_M2M=DMA_M2M_Disable;
    
    // 注意：原地址和目的地址对字长的定义不是用一个
    // 即 DMA_MemoryDataSize_HalfWord 区别于 DMA_PeripheralDataSize_HalfWord
    // 如果混用将导致DMA传输后的数据长度被截取
    
    // 配置转运数据的目的地址
    dma_def.DMA_MemoryBaseAddr= dest_addr;
    dma_def.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
    // 内存地址增加
    dma_def.DMA_MemoryInc=DMA_MemoryInc_Enable;
    
    
    // 配置转运数据的源地址
    dma_def.DMA_PeripheralBaseAddr=source_addr;
    dma_def.DMA_PeripheralDataSize= DMA_PeripheralDataSize_HalfWord;
    dma_def.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
    
    
    dma_def.DMA_Priority=DMA_Priority_High;
    
    
    
    DMA_Init(DMA1_Channel1,&dma_def);


    //DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
    
    NVIC_InitTypeDef nvic;
    
    // 根据参考手册 ADC1  只能申请 DMA1 Channel 1 
    nvic.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    
    nvic.NVIC_IRQChannelCmd = ENABLE;
    nvic.NVIC_IRQChannelPreemptionPriority=2;
    nvic.NVIC_IRQChannelSubPriority=2;
    
    
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //NVIC_Init(&nvic);
    
    
}


void restart_dma(void){

    DMA_Cmd(DMA1_Channel1,DISABLE);
    
    DMA_SetCurrDataCounter(DMA1_Channel1,4);
    
    DMA_Cmd(DMA1_Channel1,ENABLE);
    
}
